/* 
 * File:   Calculate.cpp
 * Author: song
 * 
 * Created on 2010年11月21日, 上午9:40
 */

#include "Calculate.h"

Calculate::Calculate() {
}

Calculate::Calculate(const Calculate& orig) {
}

Calculate::~Calculate() {
}

bool cmp(const trackObject &a, const trackObject &b)
{
    int ya = a.comp.rect.y + a.comp.rect.height/2;
    int yb = b.comp.rect.y + b.comp.rect.height/2;
    int t = ya - yb;
    if(t < 0) t = -t;
    if(t < 10) {
        ya = a.comp.rect.x + a.comp.rect.height/2;
        yb = b.comp.rect.x + b.comp.rect.height/2;
    }
    return ya < yb;
}

//参数计算模块的预处理部分，进行两幅画面中物体匹配和适别
//计算结果在index数组内，-1表示无匹配，否则为对应的bojsR中的下标
void Calculate::Match(vector<trackObject> objsL, vector<trackObject> objsR)
{
    //先按照y轴坐标差排序，y相差在10以内则进行x排序
    sort(objsL.begin(), objsL.begin() + objsL.size(), cmp);
    sort(objsR.begin(), objsR.begin() + objsR.size(), cmp);

    int i, j, k, ln = objsL.size(), rn = objsR.size();
    int ya, yb, t;
    int dis;
    //只扫描左边图像中的物体，进行匹配
    for(i = 0; i < ln; i++) {
        this->index[i] = -1;
        for(j = 0; j < rn; j++) {
            ya = objsL[i].comp.rect.y + objsL[i].comp.rect.height/2;
            yb = objsL[j].comp.rect.y + objsL[j].comp.rect.height/2;

            //y轴差当前扫描物体100%认为不可接受
            if(ya - yb > objsL[i].comp.rect.height) continue;
            if(yb - ya > objsL[i].comp.rect.height) break;

            //面积计算，如果变化率大于20%认为不是同一物体
            dis = objsL[i].comp.rect.height * objsL[i].comp.rect.width
                    - objsR[j].comp.rect.height * objsL[j].comp.rect.width;
            if(dis < 0) dis = -dis;
            if(dis / (objsL[i].comp.rect.height * objsL[i].comp.rect.width)
                    > 0.2) continue;
            
            this->index[i] = j;
        }
    }
}